/**
 * 通用请求封装
 */

// 服务器地址
const BASE_URL = 'https://m1.apifoxmock.com/m1/6102433-5793108-default';
// 请求超时时间
const TIMEOUT = 10000;

// 请求拦截器
const requestInterceptor = (config) => {
  // 获取token
  const token = uni.getStorageSync('token');
  
  // 如果有token，添加到请求头
  if (token) {
    config.header = {
      ...config.header,
      'Authorization': `Bearer ${token}`
    };
  }
  
  return config;
};

// 响应拦截器
const responseInterceptor = (response) => {
  const { statusCode, data } = response;
  
  // 请求成功
  if (statusCode >= 200 && statusCode < 300) {
    // 根据接口文档，服务器返回的数据格式为 { code: number, msg: string, ... }
    if (data.code !== 0 && data.code !== 200) {
      handleError({ code: data.code, message: data.msg });
      return Promise.reject(data);
    }
    
    // 返回业务数据，如果没有具体的业务数据字段，则返回整个数据对象
    return data;
  }
  
  // 请求失败
  handleError(response);
  return Promise.reject(response);
};

// 错误处理
const handleError = (error) => {
  const errorCode = error.code || error.statusCode;
  const errorMsg = error.message || error.msg || error.errMsg || '请求失败';
  
  // 401 未授权，跳转登录页
  if (errorCode === 401) {
    uni.showToast({
      title: '请先登录',
      icon: 'none'
    });
    setTimeout(() => {
      uni.navigateTo({
        url: '/pages/index/log/login'
      });
    }, 1500);
    return;
  }
  
  // 提示错误信息
  uni.showToast({
    title: errorMsg,
    icon: 'none'
  });
};

// 请求方法
const request = (options) => {
  const { url, method = 'GET', data = {}, header = {} } = options;
  
  // 完整请求路径
  const requestUrl = /^(http|https):\/\//.test(url) ? url : BASE_URL + url;
  
  // 请求配置
  const config = {
    url: requestUrl,
    method,
    data,
    header: {
      'Content-Type': 'application/json',
      ...header
    },
    timeout: TIMEOUT
  };
  
  // 应用请求拦截器
  const interceptedConfig = requestInterceptor(config);
  
  // 发起请求
  return new Promise((resolve, reject) => {
    uni.request({
      ...interceptedConfig,
      success: (res) => {
        try {
          const result = responseInterceptor(res);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      },
      fail: (err) => {
        handleError(err);
        reject(err);
      }
    });
  });
};

// 请求方法别名
const http = {
  get: (url, data, options = {}) => request({ url, method: 'GET', data, ...options }),
  post: (url, data, options = {}) => request({ url, method: 'POST', data, ...options }),
  put: (url, data, options = {}) => request({ url, method: 'PUT', data, ...options }),
  delete: (url, data, options = {}) => request({ url, method: 'DELETE', data, ...options })
};

export default http; 